package com.linkedin.parseq.httpclient;
import java.util.concurrent.atomic.AtomicReference;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.AsyncHttpClientConfig;
public class HttpClient {
private static final AtomicReference<AsyncHttpClient> _client =
new AtomicReference<AsyncHttpClient>();
/**
* Returns raw http client. If client has not been initialized yet
* then new client is created with default configuration.
* @return raw http client
*/
public static synchronized AsyncHttpClient getNingClient() {
if (_client.get() == null) {
initialize(new AsyncHttpClientConfig.Builder().build());
}
return _client.get();
}
/**
* Initializes HttpClient with custom configuration.
* @param cfg client configuration
* @see AsyncHttpClientConfig
*/
@SuppressWarnings("resource")
public static synchronized void initialize(AsyncHttpClientConfig cfg) {
if (!_client.compareAndSet(null, new AsyncHttpClient(cfg))) {
throw new RuntimeException("async http client concurrently initialized");
}
}
public static void close() {
if (_client.get() != null) {
_client.get().close();
}
}
public static WrappedRequestBuilder get(String url) {
return new WrappedRequestBuilder(getNingClient().prepareGet(url), "GET " + url);
}
public static WrappedRequestBuilder connect(String url) {
return new WrappedRequestBuilder(getNingClient().prepareConnect(url), "CONNECT " + url);
}
public static WrappedRequestBuilder options(String url) {
return new WrappedRequestBuilder(getNingClient().prepareOptions(url), "OPTIONS " + url);
}
public static WrappedRequestBuilder head(String url) {
return new WrappedRequestBuilder(getNingClient().prepareHead(url), "HEAD " + url);
}
public static WrappedRequestBuilder post(String url) {
return new WrappedRequestBuilder(getNingClient().preparePost(url), "POST " + url);
}
public static WrappedRequestBuilder put(String url) {
return new WrappedRequestBuilder(getNingClient().preparePut(url), "PUT " + url);
}
public static WrappedRequestBuilder delete(String url) {
return new WrappedRequestBuilder(getNingClient().prepareDelete(url), "DELETE " + url);
}
}